/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年8月10日
 * 项目： rainhy-config
 */
package com.rainhy.config.manager;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.rainhy.config.config.ConfigGroup;
import com.rainhy.config.config.ConfigProperty;
import com.rainhy.config.context.ConfigContext;
import com.rainhy.core.util.AssertUtils;

/**
 * 配置组代理类
 * 
 * @author rain
 * @version [版本号, 2016年8月10日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class ConfigGroupProxy implements ConfigGroup {
    
    /** 配置容器 */
    private ConfigContext configContext;
    
    /** 父级配置组解析器 */
    private ConfigGroupParse parentConfigGroupParse;
    
    /** 配置组解析实例 */
    private ConfigGroupParse configGroupParse;
    
    public ConfigGroupProxy(
            ConfigContext configContext,
            ConfigGroupParse parentConfigGroupParse,
            ConfigGroupParse configGroupParse) {
        super();
        AssertUtils.notNull(configContext, "[配置容器]不能为 null");
        AssertUtils.notNull(configGroupParse, "[配置组]不能为 null");
        this.configContext = configContext;
        this.parentConfigGroupParse = parentConfigGroupParse;
        this.configGroupParse = configGroupParse;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ConfigGroupProxy other = (ConfigGroupProxy) obj;
        if (getName() == null) {
            if (other.getName() != null)
                return false;
        } else if (!getName().equals(other.getName()))
            return false;
        return true;
    }
    
    @Override
    public List<ConfigGroup> getChilds() {
        Map<String, ConfigGroup> configGroupMapping = this.configContext.getAllConfigPropertyGroupMap();
        List<ConfigGroupParse> configGroups = this.configGroupParse.getChilds();
        
        List<ConfigGroup> configGroupList = new ArrayList<>();
        for (ConfigGroupParse localConfigGroupParse : configGroups) {
            ConfigGroup configGroup = configGroupMapping.get(localConfigGroupParse.getName());
            configGroupList.add(configGroup);
        }
        return configGroupList;
    }
    
    @Override
    public List<ConfigProperty> getConfigs() {
        Map<String, ConfigProperty> configPropertyMap = this.configContext.getAllConfigPropertyMap();
        List<ConfigPropertyParse> configs = this.configGroupParse.getConfigs();
        
        List<ConfigProperty> configPropertyList = new ArrayList<>();
        for (ConfigPropertyParse localConfigPropertyParse : configs) {
            ConfigProperty configProperty = configPropertyMap.get(localConfigPropertyParse.getKey());
            configPropertyList.add(configProperty);
        }
        return configPropertyList;
        
    }
    
    @Override
    public String getName() {
        return this.configGroupParse.getName();
    }
    
    @Override
    public String getParentName() {
        return this.parentConfigGroupParse == null ? "" : this.parentConfigGroupParse.getName();
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
        return result;
    }
    
    @Override
    public boolean isEditAble() {
        return this.parentConfigGroupParse.isEditAble();
    }
    
    @Override
    public boolean isViewAble() {
        return this.configGroupParse.isViewAble();
    }
}
